/**
 * Chain Of Responsibility 职责链模式
 * 定义：使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，
 * 并沿着这条链传递请求，直到有一个对象处理它为止。
 * 
 * 要点：
1)Chain of Responsibility 模式的应用场合在于“一个请求可能有多个接受者，但是最后真正的接受者只有一个”，
  只有这时候请求发送者与接受者的耦合才有可能出现“变化脆弱”的症状，职责链的目的就是将二者解耦，从而更好地应对变化。
2)应用了Chain of Responsibility 模式后，对象的职责分派将更具灵活性。我们可以在运行时动态添加/修改请求的处理职责。
3)如果请求传递到职责链的末尾仍得不到处理，应该有一个合理的缺省机制。这也是每一个接受对象的责任，而不是发出请求的对象的责任
 */

 // 职责链模式 -------------  和状态模式很像  只不过状态模式允许跳级，而职责链不允许
class Manager { 
  constructor(superior) {
    this.superior = superior
  }

  setSuperior(superior) {
    this.superior = superior
  }

  handleRequest(levelRequest) {

  }
}

class CommonManager extends Manager {
  handleRequest(levelRequest) {
    if (levelRequest > 2) {
      this.superior.handleRequest(levelRequest);
    } else {
      console.log(`请假${levelRequest}天被经理审批通过`);
    }
  }
}

class Majordomo extends Manager {
  handleRequest(levelRequest) {
    if (levelRequest > 5) {
      this.superior.handleRequest(levelRequest);
    } else {
      console.log(`请假${levelRequest}天被总监审批通过`);
    }
  }
}

class GeneralManager extends Manager {
  handleRequest(levelRequest) {
    console.log(`请假${levelRequest}天被总经理审批通过`);
  }
}

const manager = new CommonManager();
const superior1 = new Majordomo();
manager.setSuperior(superior1);  //设置经理的下一级
const superior2 = new GeneralManager();
superior1.setSuperior(superior2);

console.log("请假2天：");
manager.handleRequest(2);
console.log("请假4天：");
manager.handleRequest(4);
console.log("请假6天：");
manager.handleRequest(6);